perm filename GAR50.FAI[MUS,LCS] blob sn#102049 filedate 1974-05-13 generic text, type T, neo UTF8
00100		TITLE	Gardsk;  DOROTHY BENDER
00200	
00300	; ******* GAR50 ********
00400	;  ROUTINE TO READ THE OUTPUT FROM THE MUSIC
00500	;  PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
00600	;  
00700	;  THE NAME OF THE FILE TO BE INPUTTED IS 'MUSIC',
00800	;  THE FIRST RECORD OF WHICH CONTAINS THE
00900	;  NUMBER OF WORDS OF DATA IN THE ENTIRE DISK FILE.
01000	
01100	A   ←   1     ;WORK
01200	B   ←   2     ;WORK
01300	N←4
01400	FB←5
01500	TMP←7
01600	SEC←6
01700	RET ←   3     ;RETURN ACCUMULATOR
01800	BUFSIZ ←=20*2000	;19 K PER BUFFER.
01900	BANDSZ←=1280	;SECTORS PER BAND
02000	↓DSKCHN ←1             ;DISK CHANNEL FOR INPUT
02100	↓ADCHN  ←2             ;D-A CHANNEL FOR OUTPUT
02200	
02300	OPDEF FBWRT [707B8]
02400	OPDEF FBREAD [706B8]
02500		OPDEF	READCH [51B8]
02600	        OPDEF   MESSAGE[51B8!3B12]
02700	
02800	BEG:	CALLI	0,0         ;RESET I/O DEVICES
02900	 	OPEN 	DSKCHN,[17  ;MODE
03000			'DSK   '    ;DEVICE NAME
03100	 		0]          ;NO BUFFER HEADERS
03200		HALT	BEG         ;RESTART IF DEVICE IS UNAVAILABLE
03300	
03400	 	SETZM	FILBLK+3    ;FOR RESTART
03500	LX:	MESSAGE [ASCIZ/
03600	  TYPE `P' TO PLAY FROM DISK, `C' TO COPY TAPE TO DISK.
03700	/]
03800		readch a
03900		cain a,"C"
04000		jrst start
04100		caie a,"P"
04200		jrst lx
04300		skipe filblk+3	;is this first time through ?
04400		jrst pla3	;No. Parameters already set up.
04500		;FIND OUT NUMBER OF CHANNELS AND
04600		;THE SPEED.
04700	
04800		MESSAGE	[ASCIZ/HOW MANY CHANNELS?/]
04900		READCH	A
05000		SUBI	A,"0"+1		;CONVERT TO BINR AND ADD 1
05100		DPB	A,[POINT 2,OUTBIT,26]
05200	
05300		MESSAGE [ASCIZ/WHAT IS THE SPEED?/]
05400		READCH  A
05500		SUBI	A,"0"
05600		DPB	A,[POINT 3,OUTBIT,32]
05700	
05800	PLA2:	SETZM FILBLK+3
05900		SETZM FILBL2+3
06000		LOOKUP	DSKCHN,FILBLK
06100		SKIPA
06200		JRST XOPEN
06300		LOOKUP DSKCHN, FILBL2
06400	
06500		JRST	[MESSAGE[ASCIZ/
06600			***FILE 'MUSIC' NOT FOUND/]
06700			CALLI  12]
06800	        ;EXIT IF FILE IS MISSING
06900	
07000		MOVE A, FILBL2+3
07100		MOVEM A, FILBLK+3
07200	XOPEN:	movs n,filblk+3		;get length of file.
07300		movnm n,nwd
07400		movei fb,0	;Start with logical band no. 0.
07500	plx:	movei sec,0
07600		MOVE TMP,FB
07700		calli TMP,400010		;Get a fastband.
07800		halt
07900	ply:	input dskchn,[iowd bufsiz,buf1
08000				0]
08100		movem sec,plzz
08200		fbwrt fb,[	buf1	;Write out a buffer on the fastband.
08300				bufsiz
08400			 plzz:	0]
08500		halt
08600		addi n,bufsiz
08700		jumpge n,pla3	;At end of input file ?
08800		addi sec,BUFSIZ/=32	;NO
08900		cail sec,BANDSZ	;End of band ?
09000		aoja fb,plx	;Yes.
09100		jrst ply
09200	pla3:	close dskchn,0
09300		move n,nwd
09400		setzb fb,sec
09500		;BEGIN MAIN BODY OF PROGRAM
09600		OPEN	ADCHN,[117 	;MODE
09700	         	'AD    '        ;DEVICE NAME
09800	 		0]              ;NO BUFFER HEADERS
09900	
10000	  	JRST	[MESSAGE[ASCIZ/
10100			***D-A NOT AVAILABLE/]
10200			CALLI  12]
10300		;EXIT IF D-A IS UNAVAILABLE
10400	SPWAR:	SPCWAR 17,[CALLI]
10500		MESSAGE [ASCIZ/ GO? /]
10600		READCH A
10700	
10800	LOOP:	JSP	RET,subr		;RxoutINE TO READ AND WRITE
10900		BUF1-1 			;USE BUF1 FOR THE I/O
11000		JUMPLE	B,xout    	;DONE
11100		
11200		JSP	RET,subr		;CALL IT AGAIN
11300		BUF2-1			;USE BUF2 FOR THE I/O
11400		JUMPG	B,LOOP		;GO BACK FOR MORE IF B>0
11500	
11600	xout:	close dskchn,		;END OF PROGRAM.
11700		SPCWAR 0,'SSW'
11800		releas adchn,
11900		jrst lx
12000	
12100		;subrRxoutINE TO SET UP IOWD AND READ AND WRITE.
12200		;  1(RET) WILL BE THE RETURN
12300		;  0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
12400		;         PUT IN THE RIGHT HALF OF THE IOWD.
12500		;  A      WILL BE A WORK REGISTER
12600	    	;  B      WILL BE TESTED ON THE xoutSIDE.
12700	
12800	subr:	MOVNI	A,BUFSIZ	;PICK UP AND COMPLEMENT BUFSIZ
12900		ADDB	A,N		;A←NWD-BUFSIZ
13000					;NWD←NWD-BUFSIZ
13100		MOVE	B,A		;SAVE B TO BE TESTED FOR LAST
13200					;TIME.
13300		JUMPL	A,LAST		;SET UP FOR LAST TIME.
13400		MOVEI	A,0		
13500	
13600		;THE IOWD LOOKS LIKE:
13700		;  [-BUFSIZ / BUFI-1]
13800	
13900	LAST:	ADDI	A,BUFSIZ
14000		MOVNS	A		;COMPLEMENT A
14100		HRL	A,0(RET)	;PICK UP BUFI AND MOVE IT
14200					;TO THE LEFT SIDE OF A.
14300		hlrzM	A,INLIST	;SWAP A AND MOVE IT.
14400		MOVSM	A,outWC		;SAME FOR xoutPUT.
14500		movem sec,inlist+2
14600		aos inlist		;Shit.
14700		fbread fb,inlist	;Read a buffer from fast dsk.
14800		halt
14900		OUTPUT	ADCHN,OUTWC	;WRITE THE RECORD.
15000		addi sec,BUFSIZ/=32	;NO
15100		caiGE sec,BANDSZ	;End of band ?
15200		JRST	1(RET)		;RETURN
15300		movei sec,0
15400		aoja fb,1(ret)
15500	
15600	;	-----------------------------------------
15700	
15800	; STORAGE:
15900	
16000	NWD:	0			;FOR NUMBER OF WORDS OF INPUT.
16100	↓BUF1:	BLOCK	BUFSIZ+1	;BUFFER 1
16200	BUF2:	BLOCK	BUFSIZ+1	;BUFFER 2
16300	
16400	FILBLK: 'MUSIC '		;FILENAME FOR INPUT
16500		'MUS   '			;EXTENSION
16600		0			;INFORMATION ON FILE
16700		0			;PROJECT PROG#
16800	
16900	FILBL2:	'MUSAA '
17000		'DMD   '
17100		0
17200		0
17300	
17400	CLIST:	IOWD	1,NWD		;FOR THE FIRST RECORD
17500		0
17600	
17700	INLIST:	0			;WILL CONTAIN AN IOWD
17800		bufsiz
17900		0
18000	
18100	OUTWC:	0			;WILL CONTAIN AN IOWD FOR D-A
18200		3650			;MAGIC BITS FOR 136.
18300	OUTBIT: 4000			;BITS FOR D-A
18400		BLOCK	2
18500	begin magdsk
18600	
18700	A←1
18800	B←2
18900	D←3
19000	OLNG←=4096	;size of mag tape records. must be multiple of =128.(USE 2342 FOR 360 TAPES)
19100	
19200	ichn←adchn
19300	ochn←dskchn
19400	↑START:	CALLI 0
19500		INIT ICHN,3B28+17
19600		SIXBIT /MTA0/
19700		0
19800		HALT
19900		MTAPE ICHN,1	;REWIND THE TAPE
20000		JFCL
20100		INIT OCHN,17
20200		SIXBIT /DSK/
20300		0
20400		HALT
20500		ENTER OCHN,[SIXBIT /MUSIC/
20600	                    SIXBIT /MUS/
20700		            0
20800		            0]
20900		HALT
21000		loop:input ichn,olst
21100			statz ichn,20000
21200			jrst xout	;end of tape.
21300			output ochn,olst
21400			jrst loop
21500	OLST:	IOWD OLNG,OBUF
21600		0
21700	obuf←← buf1
21800		bend magdsk
21900	
22000	end beg
22100